/*
 * ColeccionDeBytes.cpp
 *
 *  Created on: 6/12/2012
 *      Author: d
 */

#include "ColeccionDeBytes.h"


ColeccionDeBytes::ColeccionDeBytes(){

	coleccionDeBytes=new std::vector<Byte*>();
	utilidades=Utilidades();
}

ColeccionDeBits* ColeccionDeBytes::obtenerColeccionDeBits(){
	ColeccionDeBits* coleccionDeBits=new ColeccionDeBits();
	Byte* byte;

	for(unsigned int numeroDeByte=0;numeroDeByte<coleccionDeBytes->size();numeroDeByte++){
		byte=coleccionDeBytes->at(numeroDeByte);

		for(int posicion=0;posicion<8;posicion++){

			int elemento=byte->obtenerElementoEnPosicion(posicion);
			coleccionDeBits->agregarElementoAlFinal(elemento);
		}
	}
	return coleccionDeBits;
}

int ColeccionDeBytes::tamanio(){
	return coleccionDeBytes->size();
}

Byte* ColeccionDeBytes::obtener(int posicion){
	return coleccionDeBytes->at(posicion);
}

void ColeccionDeBytes::agregarAlFinal(Byte* byte){
	coleccionDeBytes->push_back(byte);
}

void ColeccionDeBytes::normalizar(ColeccionDeBits* coleccionDeBits){
	int inicio=0;

		for( int posicion = inicio; true; posicion = posicion + BYTE )
		{
			 if(inicio+BYTE<coleccionDeBits->tamanio()){

				 coleccionDeBytes->push_back(obtenerSiguienteByte(coleccionDeBits,posicion));
				 inicio=posicion;
			 }else
				 return;
			 }

}



Byte* ColeccionDeBytes::obtenerbyte(ColeccionDeBits* coleccionDeBits,int tamanioDeLaPrimerTandaDeBits){
Byte* byte=new Byte();

	//tamanio de los bits de datos
	for(int i=0;i<4;i++){
		byte->agregarAlFinal(coleccionDeBits->obtenerElementoEnPosicion(i));
	}
	
	//bits de datos
	for(int j=4;j<4+tamanioDeLaPrimerTandaDeBits;j++)
				byte->agregarAlFinal(coleccionDeBits->obtenerElementoEnPosicion(j));
				
	//espacios sin utilizar			
	for(int k=4+tamanioDeLaPrimerTandaDeBits;k<8+tamanioDeLaPrimerTandaDeBits;k++)
		byte->agregarAlFinal(VALOR_IRRELEVANTE);

return byte;
}

Byte* ColeccionDeBytes::obtenerSiguienteByte(ColeccionDeBits* coleccionDeBits,int inicio){
Byte* byte=new Byte();

		//bits de datos (incluye el tamanio de los datos en los 1eros 4 bits)
		for(int k=inicio;k<inicio+BYTE;k++){

				byte->agregarAlFinal(coleccionDeBits->obtenerElementoEnPosicion(k));
		}
return byte;
}

Byte* ColeccionDeBytes::obtenerSiguienteByte(ColeccionDeBits* coleccionDeBits,int inicio,int bitsSobrantes){
Byte* byte=new Byte();

		//bits de datos
		for(int j=inicio;j<inicio+BYTE-bitsSobrantes;j++){
				byte->agregarAlFinal(coleccionDeBits->obtenerElementoEnPosicion(j));
		}
				
		//espacios sin utilizar	
		for(int k=inicio+BYTE-bitsSobrantes;k<inicio+BYTE;k++){
				byte->agregarAlFinal(VALOR_IRRELEVANTE);
		}
return byte;
}



ColeccionDeBytes::~ColeccionDeBytes() {
	// TODO Auto-generated destructor stub
}
